
#ifndef _BSP_H_DJFLDJFLSDJF12341432431234
#define _BSP_H_DJFLDJFLSDJF12341432431234


#include "stm32l4xx.h"

/*!!对外呈现最少的内部信息。
*/

/*按地址0002的寄存器定义的位。
*/
#define BIT_MASK_STAB			(1UL<< 0)
#define BIT_MASK_OFL			(1UL<< 1)
#define BIT_MASK_ZERO			(1UL<< 2)
#define BIT_MASK_NEG			(1UL<< 3)
//
#define BIT_MASK_HOLD			(1UL<< 4)		//乱了，HOLD不属于0002寄存器。



/*
K1	PB6
K2	PB7
K3	PB8
K4	PB9
K5	PC13
K6	PA11
*/
//#define KEY_IN1_VALID							(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_6)? 0:1)

#define KEY_1_VALID								(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_6)? 0:1)
#define KEY_2_VALID								(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_7)? 0:1)
#define KEY_3_VALID								(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_8)? 0:1)
#define KEY_4_VALID								(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_9)? 0:1)
#define KEY_5_VALID								(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_13)? 0:1)
#define KEY_6_VALID								(LL_GPIO_IsInputPinSet(GPIOA, LL_GPIO_PIN_11)? 0:1)

#define BUZ_ON									LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_3)	
#define BUZ_OFF									LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_3)
#define BUZ_TOG									LL_GPIO_TogglePin(GPIOB, LL_GPIO_PIN_3)

#define TP_PC9_ON								GPIOC->BSRR|=(1UL<< 9)	
#define TP_PC9_OFF								GPIOC->BSRR|=(1UL<< (9+16))
#define TP_PC9_TOG								LL_GPIO_TogglePin(GPIOC, LL_GPIO_PIN_9)

#define TP_PA8_ON								GPIOA->BSRR|=(1UL<< 8)	
#define TP_PA8_OFF								GPIOA->BSRR|=(1UL<< (8+16))
#define TP_PA8_TOG								LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_8)

//#define TP1_OFF									BUZ_OFF
//#define TP1_TOG									BUZ_TOG
//#define TP2_ON									LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_2)			
//#define TP2_OFF									LL_GPIO_ResetOutputPin(GPIOD, LL_GPIO_PIN_2)			

//准备作废，不再使用_L，_H称呼。
//#define OUT1_L									LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_12)
//#define OUT1_H									LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_12)
//#define OUT2_L									LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_11)
//#define OUT2_H									LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_11)


/*
OUTn有效：通道开启（三极管闭合）。
OUTn无效：通道关闭（三极管断开）。
*/
#ifdef WV100
    #ifdef WV100_V12
		#define IN1_VALID								(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_6)? 0:1)		//该引脚检测到L（即外接有电流）为有效（1）。同KEY_IN1_VALID，即可把它当成按键（宫哥提供思路）。
		#define IN2_VALID								(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_7)? 0:1)
	#else
		#define IN1_VALID								(LL_GPIO_IsInputPinSet(GPIOA, LL_GPIO_PIN_4)? 0:1)		//该引脚检测到L（即外接有电流）为有效（1）。同KEY_IN1_VALID，即可把它当成按键（宫哥提供思路）。
		#define IN2_VALID								(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_9)? 0:1)
	#endif
#else
	#define IN1_VALID								(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_6)? 0:1)		//该引脚检测到L（即外接有电流）为有效（1）。同KEY_IN1_VALID，即可把它当成按键（宫哥提供思路）。
	#define IN2_VALID								(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_7)? 0:1)
#endif

#define OUT_VALID								0
#define OUT_INVALID								1

#define OUT1_VALID								LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_11)						
#define OUT1_INVALID							LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_11)
#define OUT2_VALID								LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_12)							
#define OUT2_INVALID							LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_12)


#define BLE_ON									LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_2)				
#define BLE_OFF									LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_2)	


#define BUZ_TMO_Handler							TIM6_IRQHandler




typedef struct _UART_CFG{
	uint32_t baud;		//9600/19200/38400/57600/115200
	char fmt[7];		//因为面向上层，必须抽象易懂。
	uint8_t sta;		//当前状态（0--关闭，1--打开）
}UART_CFG2;


#define BUF_FIR_FULL		0		//数据缓冲满
#define BUF_FIR_NULL		1		//数据缓冲空

typedef struct _BUF_FIR{
	uint32_t sta;		//0：不被ISR使用，1：ISR使用着。
	uint16_t idx;		//用于记录访问数据的索引。
	uint16_t num;		//数据个数
	float fdat[64];		//数据。最大64，可以使用16，32个。
	int32_t idat[64];	//QQ待优化（union）。
}BUF_FIR;

extern BUF_FIR buf_I[2];
extern BUF_FIR buf_O[2];

enum SEG_MODE{SEG_LIGHT=0, SEG_OFF, SEG_FLASH};

//数码管和发光指示灯相关。
#define TMO_FLASH		(250/14)								//数码管闪烁模式时的闪周期（闪烁）。

void bsp_key_hal(void);
void bsp_seg_hal(void);
void seg_updata(char* p);

void seg_flash(uint32_t en);									//设置所有数码管的闪烁模式（闪烁固定为500ms翻转）。
void seg_flash_all(uint32_t en);
void set_one_seg(uint32_t idx, uint8_t ch, uint8_t hasDot);		//设置某个数码管的显示内容（含小数点有无）。
void set_one_seg_flash(uint32_t idx, uint8_t mode);				//设置某个数码管的闪烁模式（闪烁固定为500ms翻转）。
void set_one_seg_point(uint32_t idx, uint8_t hasDot);			//设置某个数码管的小数点模式。
void seg_mv_to_seg(int32_t mv, uint32_t sta3);					//将mv值更新到显示缓冲。
void seg_wt_to_seg(int32_t weight, int32_t div_n, uint32_t sta_led);			//将称重值更新到显示缓冲（在正常显示模式）
void seg_wt_f_to_seg(float weight, int32_t div_n, uint32_t sta_led);
void seg_wt_to_seg_in_ana(int32_t weight, int32_t wt_div_n, uint32_t sta3);		//将称重值更新到显示缓冲（在模拟量显示模式）
void seg_set_ana_to_norm(void);									//从DISP_ANA到DISP_DISP模式下，对seg的处理。
void seg_set_norm_to_ana(void);									//从DISP_NORM到DISP_ANA模式下，对seg的处理。
void wt_to_disp_buf(char* p);
	
void seg_copy_to_tmp(char* p);									//
void seg_copy_from_tmp(char* p);

uint32_t seg_stab_sta(void);

void inc_one_seg(uint32_t idx);									//调试某个数码管的数值显示。
void dec_one_seg(uint32_t idx);
void sign_one_seg(uint32_t idx);

void seg_disp_8_dot(void);										//设置所有数码管显示‘8.’。
void seg_disp_blank(void);										//设置所有数码管显示空（即灭）。
void seg_disp_logo(void);										//显示logo:"0ForcE"。

/*杂项
*/
uint32_t io_get(void);		//获取隔离输入的所有引脚状态。1--有效，0--无效。



/*蜂鸣器
*/
void buz_on(void);
void bsp_buz_hal(void);
void buz_beep(uint32_t tenms);
void buz_stop(void);



/*串口相关。
*/
extern uint8_t flag_com_modify;				//串口参数进行了修改。

//extern uint8_t flag_para_update_ad_sps;		//通信参数。
//extern uint8_t flag_com_ad_sps;				//串口参数进行了修改。


//void bsp_uart_ble_init(void);



/*PLC或RS485相关。
*/
void bsp_uart_plc_init(const char* baud_str, const char* fmt, const char* mode);
void bsp_uart_plc_config(const char* fmt, uint32_t baud, uint8_t sta);




/*超时用定时器。
*/
void bsp_tim_tmo_init(void);
uint32_t ts_get(void);
uint32_t ts_del_o_n(uint32_t ts_old, uint32_t ts_new);



/*有关DAC。
*/
uint16_t dac_get(uint8_t addr);
void bsp_dac_init(void);
void bsp_dac_config(void);
void bsp_dac_cal(void);
void bsp_dac_out(uint32_t);
int32_t dac_test_cmd(uint32_t, uint32_t);		//DAC处理调试命令。 

/*设置V-mode，电压范围：0~5
*/
//void dac_set_v_0_5(void);
//void dac_set_v_0_10(void);
//void dac_set_i_0_20(void);
//void dac_set_i_0_24(void);
//void dac_set_i_4_20(void);

int32_t dac_set_out_mode(char* mode_str);

void dac_out(uint16_t val);
void dac_rst(void);
void dac_zero_cal_val(int16_t val);

/*不使用带参数函数，仅为了不对外暴露太多东西，如RD_ADDR_status等。
*/
uint16_t dac_status(void);
uint16_t dac_get_config(void);
uint16_t dac_get_control(void);
uint16_t dac_get_dac(void);
uint32_t dac_test(void);
void dac_start(void);
void dac_stop(void);



/*有关ADC CS5530。
*/
#define MODE_WT					0
#define MODE_MV					1
#define MODE_MV_WT				2

extern uint8_t mode_mv_wt;							//mv模式或称重值模式。

void bsp_adc_init(uint32_t wr, uint32_t gain);		//支持的采样频率：120，240，480，960，1920，3840。支持的增益：0~64。					
int32_t adc_rst(void);
void adc_cmd_cal_gain(void);
void adc_cmd_cal_off(void);
void adc_cmd_conv_cont(void);						//执行连续转换操作，芯片处在数据模式，不再接收命令。

uint32_t adc_get_num(void);							//获取ADC缓冲区已有数据的个数。
uint32_t adc_get_ndata(uint32_t* p, uint32_t n);	//从ADC_BUF中已有数据读出n个，放入p[]。
uint32_t adc_get_data(uint32_t* p);					//从ADC_BUF中已有数据读出全部后放入p[]。

uint32_t adc_get_cfg(void);							//读取CS5530的configure寄存器值。
void adc_set_wordrate(uint32_t word_rate);
void adc_set_gain(uint32_t gain);					//设置增益（上电默认为1）。
void adc_cmd_start_single(void);					//执行单次转换操作。
void adc_start_cont(void);							//执行连续转换操作。
int32_t adc_stop_cont(void);
uint32_t adc_stop_stat(void);



/*FLASH操作相关函数。
*/
int32_t flash_erase_page(uint32_t page_number);
int32_t flash_prog_page(uint32_t page_number, uint8_t* p);
int32_t flash_prog_u32(uint32_t* addr_flash, uint32_t* p, uint32_t cnt);


/*看门狗复位函数
*/
__NO_RETURN void wdg_rst(void);
__NO_RETURN void core_rst(void);
void wr_bkp0R(uint32_t dat);


/**/
void out1(uint8_t sta);
void out2(uint8_t sta);

#endif

/************************ END OF FILE ************************/
